package version2;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**
 * TreeSet集合判断元素相同不是通过hashCode和equals方法来判断的，而是元素实现Comparable接口中的compareTo方法来判断的。
 */
public class TreeSetDemo {

    public static void main(String[] args) {
        //test1();
        test2();
        //test3();
    }

    private static void test3() {
        //在创建TreeSet集合对象时明确比较器。
        Set<Student> set = new TreeSet<>(new ComparatorByStudentName());
        set.add(new Student("lisi6", 21));
        set.add(new Student("lisi8", 22));
        set.add(new Student("lisi5", 25));
        set.add(new Student("lisi6", 23));
        set.add(new Student("lisi7", 20));

        out(set);
    }


    private static void test2() {
        TreeSet<Student> treeSet = new TreeSet<>();
        /*
         * TreeSet的add方法内部最终实现：
         * 需要将元素转成Comparable类型，为什么？因为这个类型具备排序的能力。
         * 这个类型中有一个专门为排序提供了一个compareTo方法。
         * 如果要让学生具备比较排序的功能，需要让学生扩展功能，实现Comparable接口。
         */
        treeSet.add(new Student("lisi6", 21));
        treeSet.add(new Student("lisi8", 22));
        treeSet.add(new Student("lisi5", 25));
        treeSet.add(new Student("lisi3", 21));
        treeSet.add(new Student("lisi7", 20));

        out(treeSet);
    }

    /**
     * 从输出结果中可以看到，向TreeSet集合中添加字符串时，是按照字符串的字典顺序进行排序了，并且相同字符串只存储一次。
     * 之所以往TreeSet集合中存储字符串时，可以让存储进去的字符串按照字典顺序进行排序是因为，
     * 字符串String类实现了Comparable接口，并且重写了compareTo方法
     */
    private static void test1() {
        //演示TreeSet,
        TreeSet<String> set = new TreeSet<>();
        set.add("nba");
        set.add("abc");
        set.add("java");
        set.add("java");
        set.add("aaa");

       out(set);
    }

    public static void out(Set<?> set) {

        for (Object t : set) {
            System.out.println(t);
        }
    }
}
